// 通用工具函数
// 该文件包含应用中常用的工具函数，提高代码复用性

// 导入订单状态配置
const orderStatusConfig = require('../orderStatusConfig');

/**
 * 格式化分页参数
 * 将请求中的分页参数转换为标准格式，并限制最大条数
 * @param {Object} query - 请求查询参数对象
 * @returns {Object} 格式化后的分页参数对象
 * @property {number} page - 当前页码
 * @property {number} limit - 每页条数
 * @property {number} offset - 偏移量，用于数据库查询
 */
const formatPagination = (query) => {
  // 获取页码，默认为第1页
  const page = parseInt(query.page) || 1;
  
  // 获取每页条数，默认为10条
  const pageSize = parseInt(query.pageSize) || 10;
  
  // 限制每页最大条数，防止恶意请求
  const limit = Math.min(pageSize, 100);
  
  // 计算偏移量，用于数据库查询
  const offset = (page - 1) * limit;
  
  // 返回格式化后的分页参数
  return {
    page,
    limit,
    offset
  };
};

/**
 * 构建模糊查询条件
 * 根据查询参数和字段列表构建Sequelize模糊查询条件
 * @param {Object} query - 查询参数对象
 * @param {Array<string>} fields - 需要进行模糊查询的字段名数组
 * @returns {Object} Sequelize查询条件对象
 */
const buildLikeQuery = (query, fields) => {
  // 初始化查询条件对象
  const whereConditions = {};
  
  // 遍历需要模糊查询的字段
  fields.forEach(field => {
    // 如果查询参数中包含该字段且不为空
    if (query[field]) {
      // 特殊处理订单状态字段，将字符串状态转换为数字代码
      if (field === 'status') {
        // 查找匹配的状态标签
        const statusOption = orderStatusConfig.statusOptions.find(
          option => option.label === query[field]
        );
        
        // 如果找到匹配的状态，使用数字代码；否则使用原值
        const statusValue = statusOption ? statusOption.value : query[field];
        
        // 对于状态字段，使用精确匹配而不是模糊查询
        whereConditions[field] = statusValue;
      } else {
        // 构建该字段的模糊查询条件
        whereConditions[field] = {
          // 使用Sequelize的Op.like操作符
          [require('sequelize').Op.like]: `%${query[field]}%`
        };
      }
    }
  });
  
  // 返回构建好的查询条件
  return whereConditions;
};

/**
 * 生成分页信息
 * 根据总记录数、当前页和每页条数计算分页信息
 * @param {number} totalCount - 总记录数
 * @param {number} page - 当前页码
 * @param {number} limit - 每页条数
 * @returns {Object} 分页信息对象
 * @property {number} currentPage - 当前页码
 * @property {number} pageSize - 每页条数
 * @property {number} totalCount - 总记录数
 * @property {number} totalPages - 总页数
 */
const generatePaginationInfo = (totalCount, page, limit) => {
  // 计算总页数
  const totalPages = Math.ceil(totalCount / limit);
  
  // 返回分页信息
  return {
    currentPage: page,    // 当前页码
    pageSize: limit,      // 每页条数
    totalCount,           // 总记录数
    totalPages            // 总页数
  };
};

// 导出所有工具函数
module.exports = {
  formatPagination,      // 分页参数格式化函数
  buildLikeQuery,        // 模糊查询条件构建函数
  generatePaginationInfo // 分页信息生成函数
};